#include "diag_engine.h"
#include "lexer.h"
#include "parser.h"
#include "printVisitor.h"
#include "codegen.h"
#include "llvm/Support/MemoryBuffer.h"
#include "llvm/Support/ErrorOr.h"
#include <memory>

int main(int argc, char* argv[])
{
    if(argc < 2)
    {
        llvm::outs() << "please input filename!\n";
        return 0;
    }

    const char* fileName = argv[1];
    static llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> buf = llvm::MemoryBuffer::getFile(fileName);
    if(!buf)
    {
        llvm::errs() << "can't open file!\n"; 
        return -1;
    }   
    llvm::SourceMgr mgr;
    DiagEngine diagEngine(mgr);
    mgr.AddNewSourceBuffer(std::move(*buf), llvm::SMLoc());
    Lexer lex(diagEngine, mgr);
    Token tok;
    //// 测试 Lexer 的功能
    // lex.NextToken(tok);
    // while(true)
    // {
    //     if(tok.tokenType != TokenType::eof)
    //     {
    //         tok.Dump();
    //         lex.NextToken(tok);
    //     }
    //     else break;
    // }
    // 测试 Parser 的功能
    Sema sema(diagEngine);
    Parser parser(lex, sema);
    std::shared_ptr<Program> program = parser.ParseProgram();
    // PrintVisitor printVisitor(program);
    //// 测试 CodeGen 的功能
    CodeGen codeGen(program);
    return 0;
}